<?php

namespace app\payment\admin;

use app\common\builder\ZBuilder;
use app\payment\model\Usergraylist as UsergraylistModel;
use app\payment\model\Userwhitelist as UserwhitelistModel;
use app\api\controller\DayUser as DayUserController;

/**
 * 用户灰名单控制器
 */
class Usergraylist extends Index
{

    protected function initialize()
    {
        parent::initialize();
        if (!in_array(request()->action(), ['index'])) {
            if ($this->no_auth) {
                $this->error('权限不足！');
            }
        }
    }

    /**
     * 首页
     * @return mixed
     */
    public function index()
    {
        // 设置搜索参数
        $search = ['merchant_id' => '商户号', 'user_id' => '用户ID', 'app_id' => '应用ID', 'class' => '类型'];

        // 获取查询条件
        $map = $this->getMap();

        if ($this->no_auth) {
            $map[] = ['merchant_id', '=', $this->merchant_id];
            unset($search['merchant_id']);
        }

        $list_rows = input('list_rows', 20) >= 20 ? 20 : input('list_rows');
        // 数据列表
        $data_list = UsergraylistModel::where($map)->order('id desc')->paginate($list_rows);
        // 分页数据
        $page = $data_list->render();

        $items = [
            ['id', 'ID'],
            ['merchant_id', '商户', 'callback', function ($value) {
                return $value . '<br/>' . get_user_nickname($value);
            }, '', 'text-center'],
            ['user_id', '用户ID'],
            ['app_id', '应用名称', 'callback', function ($value) {
                return $value ? $value . '<br/>' . UsergraylistModel::appName($value) : '';
            }, '', 'text-center'],
            ['count', '支付次数'],
            ['source_count', '来源次数'],
            ['class', '类型', 'status', '', ['白名单', '黑名单']],
            ['create_time', '创建时间', 'datetime', '', 'Y-m-d H:i:s'],
            ['update_time', '更新时间', 'datetime', '', 'Y-m-d H:i:s'],
            ['right_button', '操作', 'btn']
        ];
        // 清空
        $btn_clear = [
            'title' => '清空',
            'class' => 'btn btn-primary ajax-get confirm',
            'href' => url('clear'),
            'data-title' => '真的要清空用户灰名单吗？',
            'data-tips' => '可能存在白名单用户！'
        ];
        // 全部加入白名单
        $btn_allwhite = [
            'title' => '全部加入白名单',
            'class' => 'btn btn-success ajax-get confirm',
            'href' => url('allwhite'),
            'data-title' => '真的要全部加入白名单吗？',
            'data-tips' => '请明白其中的功能！'
        ];
        // 手动检测
        $btn_check = [
            'title' => '手动检测',
            'class' => 'btn btn-info ajax-get confirm',
            'href' => url('check'),
            'data-title' => '真的要手动检测吗？',
            'data-tips' => '请明白其中的功能！'
        ];

        $tips = '用户灰名单《可能》是优质用户，系统只检测，不处理。如果确定是优质用户，请加入用户白名单！';
        // 使用ZBuilder快速创建数据表格
        return ZBuilder::make('table')
            ->setPageTitle($tips) // 设置页面标题
            ->setTableName('payment_user_graylist') // 设置数据表名
            ->setPrimaryKey('id') // 设置主键名为id
            ->setSearch($search) // 设置搜索参数
            ->addColumns($items)
            ->addRightButton('white', ['title' => '加入用户白名单', 'class' => 'ajax-get confirm', 'icon' => 'fa fa-fw fa-check-circle', 'data-title' => '真的要加入用户白名单吗？', 'data-tips' => '请明白其中的功能！', 'href' => url('white', ['id' => '__id__'])])
            ->addTopButtons('delete') // 批量添加顶部按钮
            ->addTopButton('btn_clear', $btn_clear) // 清空
            ->addTopButton('btn_allwhite', $btn_allwhite) // 全部加入白名单
            ->addTopButton('btn_check', $btn_check) // 手动检测
            ->setRowList($data_list) // 设置表格数据
            ->replaceRightButton(['class' => 1], '', 'white') // 替换右侧按钮
            ->setPages($page) // 设置分页数据
            ->fetch(); // 渲染页面
    }

    /**
     * 加入用户白名单
     * @param null $id 
     * @return mixed
     */
    public function white($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }
        // 获取数据
        $info = UsergraylistModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('参数有误！');
        }

        // 用户白名单是否存在
        $user_whitelist = UserwhitelistModel::where('merchant_id', $info['merchant_id'])
            ->where('user_id', $info['user_id'])
            ->where('app_id', $info['app_id'])
            ->find();
        if ($user_whitelist) {
            $this->error("操作失败，数据已经存在");
        } else {
            $user_data['merchant_id'] = $info['merchant_id'];
            $user_data['user_id'] = $info['user_id'];
            $user_data['app_id'] = $info['app_id'];
            $user_data['create_time'] = time();
            $user_data['status'] = 1;
            $user_data['operation_id'] = $this->merchant_id;

            UserwhitelistModel::create($user_data);
            UsergraylistModel::where('id', $id)->delete();
            $this->success("操作成功");
        }
    }

    /**
     * 全部加入用户白名单
     * @param null $id 
     * @return mixed
     */
    public function allwhite()
    {
        // 获取数据
        $all_info = UsergraylistModel::where(['class' => 0])->select();

        static $count = 0;

        try {
            foreach ($all_info as $info) {
                // 用户白名单是否存在
                $user_whitelist = UserwhitelistModel::where('merchant_id', $info['merchant_id'])
                    ->where('user_id', $info['user_id'])
                    ->where('app_id', $info['app_id'])
                    ->find();
                if ($user_whitelist) {
                    // $this->error("操作失败，数据已经存在");
                } else {
                    $user_data['merchant_id'] = $info['merchant_id'];
                    $user_data['user_id'] = $info['user_id'];
                    $user_data['app_id'] = $info['app_id'];
                    $user_data['create_time'] = time();
                    $user_data['status'] = 1;
                    $user_data['operation_id'] = $this->merchant_id;

                    UserwhitelistModel::create($user_data);
                    UsergraylistModel::where('id', $info['id'])->delete();
                    $count++;
                }
            }
        } catch (\Exception $e) {
            $this->error("失败，错误说明：{$e->getMessage()}");
        }

        $this->success("操作成功，共操作｛{$count}｝个数据！");
    }

    /**
     * 手动检测 
     */
    public function check()
    {
        $day_user = new DayUserController;
        $day_user->user('inside');
        $this->success('操作完成！');
    }

    /**
     * 清空 
     */
    public function clear()
    {
        UsergraylistModel::where('create_time', '>', 0)->delete();
        $this->success('清空完成！');
    }

    /**
     * 删除
     * @param array $record 
     * @return mixed
     */
    public function delete($record = [])
    {
        return $this->setStatus('delete');
    }

    /**
     * 启用
     * @param array $record 
     * @return mixed
     */
    public function enable($record = [])
    {
        return $this->setStatus('enable');
    }

    /**
     * 禁用
     * @param array $record 
     * @return mixed
     */
    public function disable($record = [])
    {
        return $this->setStatus('disable');
    }

    /**
     * 设置状态：删除、禁用、启用
     * @param string $type 类型：delete/enable/disable
     * @param array $record 
     * @return mixed
     */
    public function setStatus($type = '', $record = [])
    {
        $ids = $this->request->isPost() ? input('post.ids/a') : input('param.ids');
        $ids_delete = is_array($ids) ? '' : $ids;
        $data = UsergraylistModel::where('id', 'in', $ids)->column('id');
        return parent::setStatus($type, ['payment_user_graylist_' . $type, 'payment_user_graylist', $ids_delete, UID, implode('、', $data)]);
    }

    /**
     * 快速编辑
     * @param array $record 行为日志
     * @return mixed
     */
    public function quickEdit($record = [])
    {
        $id = input('post.pk', '');
        $field = input('post.name', '');
        $value = input('post.value', '');
        $data = UsergraylistModel::where('id', $id)->value($field);
        $details = '字段(' . $field . ')，原值(' . $data . ')，新值：(' . $value . ')';
        return parent::quickEdit(['payment_user_graylist_edit', 'payment_user_graylist', $id, UID, $details]);
    }
}
